#include <future>
#include <thread>
#include <iostream>
#include <stdexcept>
// set_exception 就是 “把异常当成返回值” 发给对方线程，让 future.get() 也能 正常出错 而不死等
void risky_work(std::promise<int> prom)
{
    try
    {
        throw std::runtime_error("disk full");
        prom.set_value(42);
    }
    catch (...)
    {                                                 // 捕获任意异常
        prom.set_exception(std::current_exception()); // 塞进通道
    }
}

int main()
{
    std::promise<int> prom;
    std::future<int> fut = prom.get_future();

    std::thread t(risky_work, std::move(prom));

    try
    {
        int v = fut.get(); // 这里会重新抛出
        std::cout << "v = " << v << '\n';
    }
    catch (const std::exception &e)
    {
        std::cout << "async error: " << e.what() << '\n';
    }

    t.join();
    return 0;
}